package lanqiao;
/**
 * 括号序列【第十二届】【省赛】【B组】
 * 例如，对于括号序列((()，只需要添加两个括号就能让其合法，有以下几种不同的添加结果:()()()、()(())、(())()、(()())和((()))。
 * [输入格式]
 * 输入一行包含一个字符串s，表示给定的括号序列，序列中只有左括号和右括号。
 * [输出格式]
 * 输出一个整数表示答案，答案可能很大，请输出答案除以100000007 (即10^9+7)的余数。
 */
import java.util.*;

public class Prev_271 {

    private static List<Integer> inner = new ArrayList<>();
    private static int count = 0;
    private static Set<Integer> setAll = new HashSet<>();

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String s = input.next();

        int left = 0, right = 0;
        for (int i = 0; i < s.length(); i++) {
            if(s.charAt(i) == '('){
                left ++;
            }else{
                right ++;
            }
        }
        int n = Math.max(left, right);
        int[] num = new int[n * 2];
        for (int i = n; i < num.length; i++) {
            num[i] = 1;
        }
        dfs(num);
        System.out.println(count);
    }

    private static void dfs(int[] s) {
        //边界条件
        if(inner.size() == s.length){
            if(isLegal(inner)){
                count ++;
            }
            return;
        }

        Set<Integer> set = new HashSet<>();
        for(int i = 0; i < s.length; i++){
            if(!set.contains(s[i]) && !setAll.contains(i)){
                set.add(s[i]);
                setAll.add(i);
                inner.add(s[i]);
                dfs(s);
                inner.remove(inner.size() - 1);
                setAll.remove(i);
            }
        }
    }

    private static boolean isLegal(List<Integer> inner) {
        //假设0是左括号，1是右括号
        if(inner.get(0) == 1 || inner.get(inner.size() - 1) == 0){
            return false;
        }
        //利用栈判断括号序列是否合法
        Deque<Integer> stack = new ArrayDeque<>();
        //遍历括号序列的下标
        int i = 0;
        while(i < inner.size()){
            if(stack.isEmpty()){
                stack.push(inner.get(i));
            }else if(stack.peek() == 0 && inner.get(i) == 1){
                stack.pop();
            }else{
                stack.push(inner.get(i));
            }
            i ++;
        }
        if(stack.isEmpty()){
            return true;
        }else{
            return false;
        }
    }
}
